CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা ওয়েব ব্রাউজারকে একটি ডোমেন থেকে অন্য ডোমেনে রিসোর্স (যেমন, API কল) অ্যাক্সেস করতে বাধা দেয়, তবে কিছু নির্দিষ্ট কনফিগারেশন বা অনুমতি দেয়ার মাধ্যমে এটি কার্যকর করা যায়। Spring Security তে CORS কনফিগারেশন করার মাধ্যমে আপনি কীভাবে এক ডোমেনের ক্লায়েন্ট অন্য ডোমেনে অবস্থান করা API-এর সাথে নিরাপদে যোগাযোগ করতে পারে তা নিয়ন্ত্রণ করতে পারেন।
Step 1: Spring Security-এ CORS কনফিগারেশন
Spring Security তে CORS কনফিগার করার জন্য আপনি WebSecurityConfigurerAdapter বা SecurityFilterChain ব্যবহার করতে পারেন।
Option 1: CORS কনফিগারেশন SecurityConfig ক্লাসের মধ্যে
Spring Security তে CORS কনফিগারেশন করতে HttpSecurity এবং CorsConfigurationSource ব্যবহার করা হয়।
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and() // Enable CORS for the application
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Define public paths
.anyRequest().authenticated() // Define paths that need authentication
.and()
.formLogin().permitAll() // Enable form login
.and()
.logout().permitAll(); // Enable logout
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(true); // Allow credentials (cookies, headers, etc.)
corsConfig.addAllowedOrigin("*"); // Allow all origins, you can restrict to specific origins
corsConfig.addAllowedHeader("*"); // Allow all headers, you can restrict to specific headers
corsConfig.addAllowedMethod("*"); // Allow all methods (GET, POST, etc.)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig); // Apply CORS configuration to all endpoints
return source;
}
}
Explanation:
- cors(): এটি Spring Security-এর মধ্যে CORS সক্রিয় করার জন্য ব্যবহৃত হয়।
- CorsConfigurationSource: এটি CORS কনফিগারেশন ফাইল তৈরি করতে সাহায্য করে যেখানে আপনি অনুমোদিত উত্স (origins), পদ্ধতি (methods), এবং শিরোনাম (headers) কনফিগার করতে পারেন।
- setAllowCredentials(true): এটি ব্রাউজারে credentials (cookies) পাঠানোর অনুমতি দেয়।
Option 2: CORS কনফিগারেশন WebSecurityConfigurerAdapter ছাড়া
যদি আপনি Spring Boot 2.4 বা তার পরবর্তী সংস্করণ ব্যবহার করেন, তবে SecurityFilterChain পদ্ধতিতে CORS কনফিগারেশন করতে পারেন:
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors().and() // Enable CORS
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public API endpoints
.anyRequest().authenticated(); // Secure API endpoints
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(true); // Allow credentials
corsConfig.addAllowedOrigin("https://example.com"); // Allow specific origins
corsConfig.addAllowedHeader("*"); // Allow all headers
corsConfig.addAllowedMethod("*"); // Allow all HTTP methods
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig); // Apply configuration to all endpoints
return source;
}
}
Step 2: CORS Configuration Breakdown
setAllowCredentials(true):- এটি ব্রাউজারে cookies, authorization headers, বা TLS client certificates পাঠানোর অনুমতি দেয়। যদি এটি
falseথাকে, তবে credentials পাঠানো সম্ভব হবে না।
- এটি ব্রাউজারে cookies, authorization headers, বা TLS client certificates পাঠানোর অনুমতি দেয়। যদি এটি
addAllowedOrigin("*"):- এটি সমস্ত উত্স (origins) থেকে রিকুয়েস্ট গ্রহণ করতে দেয়। আপনি যদি শুধুমাত্র কিছু নির্দিষ্ট উত্স অনুমোদিত করতে চান, তবে এটি পরিবর্তন করতে পারেন, যেমন:
corsConfig.addAllowedOrigin("https://example.com")।
- এটি সমস্ত উত্স (origins) থেকে রিকুয়েস্ট গ্রহণ করতে দেয়। আপনি যদি শুধুমাত্র কিছু নির্দিষ্ট উত্স অনুমোদিত করতে চান, তবে এটি পরিবর্তন করতে পারেন, যেমন:
addAllowedMethod("*"):- এটি সমস্ত HTTP পদ্ধতি (GET, POST, PUT, DELETE, ইত্যাদি) অনুমোদিত করে। আপনি যদি কিছু নির্দিষ্ট HTTP পদ্ধতি সীমাবদ্ধ করতে চান, তবে আপনি এখানে পরিবর্তন করতে পারেন, যেমন:
corsConfig.addAllowedMethod("GET")।
- এটি সমস্ত HTTP পদ্ধতি (GET, POST, PUT, DELETE, ইত্যাদি) অনুমোদিত করে। আপনি যদি কিছু নির্দিষ্ট HTTP পদ্ধতি সীমাবদ্ধ করতে চান, তবে আপনি এখানে পরিবর্তন করতে পারেন, যেমন:
addAllowedHeader("*"):- এটি সমস্ত হেডারকে অনুমোদিত করে। আপনি যদি নির্দিষ্ট হেডার ব্যবহার করতে চান, তবে সেগুলি এখানে উল্লেখ করতে হবে।
Step 3: Controller এর মধ্যে CORS কনফিগারেশন
Spring MVC Controller-এ নির্দিষ্টভাবে CORS কনফিগারেশন করতে, আপনি @CrossOrigin অ্যানোটেশন ব্যবহার করতে পারেন।
package com.example.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@CrossOrigin(origins = "https://example.com") // Allow CORS for a specific origin
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
এখানে, @CrossOrigin অ্যানোটেশনটি GET /hello এন্ডপয়েন্টে CORS অনুমতি দেয় এবং এটি শুধুমাত্র https://example.com থেকে রিকুয়েস্ট গ্রহণ করবে।
Step 4: Testing CORS
CORS কনফিগারেশন সফলভাবে কাজ করছে কিনা তা নিশ্চিত করার জন্য আপনি ফ্রন্টএন্ড থেকে API কল করতে পারেন এবং ব্রাউজারের ডেভেলপার কনসোল চেক করতে পারেন।
Example of a CORS Error (If Not Configured Properly):
Access to XMLHttpRequest at 'http://localhost:8080/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Successful CORS Configuration Response:
- HTTP Response Header:
Access-Control-Allow-Origin: *
উপসংহার
Spring Security তে CORS কনফিগারেশন করার মাধ্যমে আপনি বিভিন্ন উৎস (origins) থেকে আপনার অ্যাপ্লিকেশনের রিসোর্স অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। এটি নিরাপত্তা বৃদ্ধি করে এবং শুধুমাত্র নির্দিষ্ট উৎস থেকে অনুরোধ অনুমোদিত করতে সহায়ক। CORS কনফিগারেশন Spring Security-এর HTTP সিকিউরিটি কনফিগারেশন বা @CrossOrigin অ্যানোটেশন দ্বারা সহজেই সম্পাদন করা যায়।
Read more